BigQueryでBigLakeテーブルを作ってみた
Google Cloudデータエンジニアのはんざわです。
今回の記事では、Cloud StorageをデータストアとするBigLakeテーブルを作ってみたいと思います。
そもそもBigLakeテーブルとは?
BigLakeテーブルは、従来の外部テーブルと同様に外部のデータストアのデータにアクセス可能なテーブルです。
従来の外部テーブルと比較するとアクセス権の委任により、「ユーザーがBigLakeテーブルにアクセスする権限」と「BigLakeテーブルがデータストアを参照する権限」が分離されている点で異なります。
BigLakeテーブルは、Cloud StorageにアクセスするためにBigQuery Connectionを使用します。
このConnectionには、データストアを参照する権限を割り当てることができ、これによりBigLakeテーブルへのアクセス権限とデータストアの参照権限を分離することが可能になります。
また、BigLakeテーブルでサポートされているデータストアは以下の通りです。
- Amazon S3(BigQuery Omniを使用)
- Blob Storage(BigQuery Omniを使用)
- Cloud Storage
BigLakeテーブルを作ってみる
以下のドキュメントを参考にしています。
サンプルデータの準備
まずは、データストアとなるCloud Storageを作成します。
gcloud storage buckets create gs://test-data-hanzawa \ --location='us-central1'
次にBigQueryの一般公開データをCloud Storageにエクスポートします。
EXPORT DATA OPTIONS ( uri = 'gs://test-data-hanzawa/*.json', format = 'JSON' ) AS SELECT * FROM bigquery-public-data.github_repos.files; > 2309424945 個の行を 346 ファイルに正常にエクスポートしました。
正常にエクスポートが完了しました。
BigQuery Connectionを作成する
以下のコマンドでBigQuery Connectionを作成します。
bq --location='us-central1' mk \ --connection \ --connection_type=CLOUD_RESOURCE \ biglake_test
以下のキャプチャの通り、biglake_test
という名前のBigQuery Connectionを作成できました。
BigQuery Connectionを作成すると、自動でサービスアカウントが割り振られます。
今回の例だと赤枠のbqcx-868908576898-9lb9@gcp-sa-bigquery-condel.iam.gserviceaccount.com
がそれに該当します。
このサービスアカウントが前述したBigLakeテーブルがデータストアを参照する役割を担います。
以下のコマンドで対象のCloud Storage単位でサービスアカウントにroles/storage.objectViewer
の権限を付与します。
gcloud storage buckets add-iam-policy-binding gs://test-data-hanzawa \ --member=serviceAccount:bqcx-868908576898-9lb9@gcp-sa-bigquery-condel.iam.gserviceaccount.com \ --role='roles/storage.objectViewer'
これでBigQuery Connectionの準備が完了しました。
BigLakeテーブルを作成する
まずはBigQueryのデータセットを作成します。
以下のコマンドでbiglake
という名前のデータセットを作成しました。
bq --location='us-central1' mk \ --dataset \ biglake
次にBigLakeテーブルを作成します。
基本的には通常の外部テーブルを作成する構文と同じですが、BigLakeテーブルでは2行目のようにWITH CONNECTION
で事前に作成したBigQuery Connection
を指定します。
CREATE EXTERNAL TABLE `biglake.sample_biglake_table` WITH CONNECTION `us-central1.biglake_test ` OPTIONS ( format ='JSON', uris = ['gs://test-data-hanzawa/*'] );
以下のキャプチャのようにテーブルが作成できました。
BigLakeテーブルでは、テーブル名の右隣にBigLake
と付いているのが特徴です。
クエリを実行してみる
試しにデータの件数をカウントするクエリを実行してみます。
SELECT COUNT(*) FROM biglake.sample_biglake_table > 2309424945
ちゃんと実行することができました。
まとめ
今回はBigLakeテーブルを作成してみました。
現在では、従来の外部テーブルよりもBigLakeテーブルを使用することが推奨されていますので是非活用してみてください。
次回の記事では、BigLakeテーブルを使用するメリットを従来の外部テーブルと比較しながら紹介したいと思います。